package factory;

/**
 * 每种事物必须打印自己是什么
 */
interface Say{
    void say();
}

/**
 * 交通工具
 */
abstract class Traffic implements Say{

}

/**
 * 食物
 */
abstract class Food implements Say{

}

/**
 * 武器
 */
abstract class Arms implements Say{

}

/**
 * 抽象的种族 但是种族都需的抽象内容组成。
 * 由多个抽象的内容组成了一族内容。
 */
abstract class RaceAbstractFactory{
    abstract Traffic createTraffic();
    abstract Food createFood();
    abstract Arms createArms();
}

/**
 * 人族
 */
class Person extends RaceAbstractFactory{

    @Override
    Traffic createTraffic() {
        return new Traffic() {
            @Override
            public void say() {
                System.out.println("人类的交通工具汽车");
            }
        };
    }

    @Override
    Food createFood() {
        return new Food() {
            @Override
            public void say() {
                System.out.println("人类的食物面包");
            }
        };
    }

    @Override
    Arms createArms() {
        return new Arms() {
            @Override
            public void say() {
                System.out.println("人类的武器ak47");
            }
        };
    }
}


class Spirit extends RaceAbstractFactory{

    @Override
    Traffic createTraffic() {
        return new Traffic() {
            @Override
            public void say() {
                System.out.println("spirit的交通工具跳著");
            }
        };
    }

    @Override
    Food createFood() {
        return new Food() {
            @Override
            public void say() {
                System.out.println("spirit的食物蘑菇");
            }
        };
    }

    @Override
    Arms createArms() {
        return new Arms() {
            @Override
            public void say() {
                System.out.println("spirit的武器兔兔");
            }
        };
    }
}


public class AbstractFactory {
    public static void main(String[] args) {
        System.out.println("abstract factory");

        // 构建产品族
        RaceAbstractFactory raceAbstractFactory = new Spirit();

        raceAbstractFactory.createTraffic().say();
        raceAbstractFactory.createFood().say();
        raceAbstractFactory.createArms().say();
    }
}
